#ifndef GLOBAL_H
#define GLOBAL_H
#include <QString>
#include <QDataStream>
#include <QTime>

// 用户列表保存路径
extern const QString USER_DATA_PATH;

// 用户状态
enum UserStatus{
    ONLINE,
    NOT_ONLINE
};

enum MessageType{
    PURE_STRING
};

/**
 * @brief The Header enum TCP协议
 *
    // 请求协议
    USER_ID_FOR_CHAT_HISTORY,               使用用户id请求用户聊天记录         USER_ID_FOR_CHAT_HISTORY#id1#id2
    USER_ID_FOR_INFORMATION,                使用用户id请求用户信息             USER_ID_FOR_INFORMATION#id
    USER_ID_FOR_FRIEND_LIST,                使用用户id请求用户好友列表         USER_ID_FOR_FRIEND_LIST#id

    INSERT_CHAT_HISTORY,                    插入聊天记录                      INSERT_CHAT_HISTORY#id1#id2#chatHistory

    UPDATE_USER_INFORMATION_WITH_ID,        使用用户id更新用户信息             UPDATE_USER_INFORMATION_WITH_ID#id#user
    // 返回协议
    RETURN_CHAT_HISTORY_WITH_USER_ID_OK,    获取用户聊天记录成功               RETURN_CHAT_HISTORY_WITH_USER_ID_OK#id1#id2#listSize#data
    RETURN_FRIEND_LIST_WITH_USER_ID_OK,     获取好友列表成功                   RETURN_FRIEND_LIST_WITH_USER_ID_OK#id#listSize#data

    INSERT_CHAT_HISTORY_OK,                 插入历史记录成功

    UPDATE_USER_INFORMATION_OK,             更新用户信息成功
    // 错误协议
    RETURN_CHAT_HISTORY_WITH_USER_ID_ERROR, 获取用户聊天记录失败
    RETURN_INFORMATION_WITH_USER_ID_ERROR,  获取用户信息失败
    RETURN_FRIEND_LIST_WITH_USER_ID_ERROR,  获取用户好友列表失败

    INSERT_CHAT_HISTORY_ERROR,              插入聊天记录失败

    UPDATE_USER_INFORMATION_ERROR           更新用户信息失败
 */
enum Header{
    // 请求协议
    USER_ID_FOR_CHAT_HISTORY,
    USER_ID_FOR_INFORMATION,
    USER_ID_FOR_FRIEND_LIST,

    INSERT_CHAT_HISTORY,

    INSERT_USER_INFORMATION,

    UPDATE_USER_INFORMATION_WITH_ID,
    // 返回协议
    RETURN_CHAT_HISTORY_WITH_USER_ID_OK,
    RETURN_INFORMATION_WITH_USER_ID_OK,
    RETURN_FRIEND_LIST_WITH_USER_ID_OK,

    INSERT_CHAT_HISTORY_OK,

    INSERT_USER_OK,

    UPDATE_USER_INFORMATION_OK,
    // 错误协议
    RETURN_CHAT_HISTORY_WITH_USER_ID_ERROR,
    RETURN_INFORMATION_WITH_USER_ID_ERROR,
    RETURN_FRIEND_LIST_WITH_USER_ID_ERROR,

    INSERT_CHAT_HISTORY_ERROR,

    INSERT_USER_ERROR,

    UPDATE_USER_INFORMATION_ERROR,

    // 插入和删除好友关系
    INSERT_FRIEND_RELATION,

    INSERT_FRIEND_RELATION_OK,

    INSERT_FRIEND_RELATION_ERROR,

    DELETE_FRIEND_RELATION,

    DELETE_FRIEND_RELATION_OK,

    DELETE_FRIEND_RELATION_ERROR
};

QDataStream &operator<<(QDataStream &out, const Header &h);
QDataStream &operator>>(QDataStream &in, Header &h);

struct User{
    int id;                 // 用户id
    QString ip;
    QString user_name;      // 用户昵称
    QString user_password;  // 用户密码
    UserStatus user_status; // 用户状态
};

// QDataStream 读写操作符
QDataStream &operator<<(QDataStream &out, const User &u);
QDataStream &operator>>(QDataStream &in, User &u);

struct Friend{
    int id;                     // 本人id
    int friend_id;              // 好友id
    UserStatus friend_status;   // 好友状态
};

QDataStream &operator<<(QDataStream &out, const Friend &f);
QDataStream &operator>>(QDataStream &in, Friend &f);

struct ChatHistory{
    int user_one_id;            // 用户1id
    int user_two_id;            // 用户2id
    QString message;            // 消息
    QTime message_time;         // 消息发送时间
    MessageType message_type;   // 消息类型
};

QDataStream &operator<<(QDataStream &out , const ChatHistory &m);
QDataStream &operator>>(QDataStream &in, ChatHistory &f);
#endif // GLOBAL_H
